#pragma once 

#include <string>
#include <chrono>
#include <ctime>

namespace Common {
  using Nanos= int64_t;  // 使用 64 位整型表示纳秒时间戳

  // 时间单位换算关系（基于纳秒），保持 constexpr 方便编译期计算
  constexpr Nanos NANOS_TO_MICROS = 1000;                     // 纳秒 -> 微秒
  constexpr Nanos MICROS_TO_MILLIS = 1000;                    // 微秒 -> 毫秒
  constexpr Nanos MILLIS_TO_SECS = 1000;                      // 毫秒 -> 秒
  constexpr Nanos NANOS_TO_MILLIS = NANOS_TO_MICROS * MICROS_TO_MILLIS; // 纳秒 -> 毫秒
  constexpr Nanos NANOS_TO_SECS = NANOS_TO_MILLIS * MILLIS_TO_SECS;     // 纳秒 -> 秒

  // 获取从 epoch 到当前的纳秒数；使用 system_clock 保持与 wall-clock 一致
  inline auto getCurrentNanos() noexcept {
    return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  }

  // 获取当前时间的字符串表示，写入外部传入的 std::string
  // 返回引用以便调用方链式使用
  inline auto& getCurrentTimeStr(std::string* time_str) {
    const auto time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
    time_str->assign(ctime(&time));      // ctime 返回带换行符的字符串
    if(!time_str->empty())
      time_str->at(time_str->length()-1) = '\0';  // 去掉尾部的换行符
    return *time_str;
  }
}